工程编译成功后,输出目录里常会先看到一个.out文件。若烧录工具要求BIN,不能直接把它改名为.bin:IAR需要先完成链接,再通过输出转换器生成指定格式。动手前最好看一眼烧录工具要求的是BIN还是HEX,以及它是否要求单独填写写入地址。下面以IAR Embedded Workbench for Arm为例说明。
改了一个源文件,按下编译,窗口却只提示工程已是最新;换个时候,构建中途停了,翻来翻去又找不到具体错误。这种情况容易让人以为IAR漏了消息。其实构建窗口显示的是这一次构建产生的内容:如果文件没有参与编译,或窗口内容被清空,之前的错误不会留在那里。下面以IAR Embedded Workbench for Arm为例,从打开窗口开始检查。
IAR Embedded Workbench编译工程时,可以针对Debug和Release分别设置代码优化级别。优化打开后,编译器可能删除没有实际用途的局部变量、把变量暂存在寄存器中、调整语句执行顺序,或者直接把函数展开到调用位置,所以C-SPY里看到的变量状态可能和源码不完全对应。常见表现包括变量显示Unavailable、局部变量突然消失、单步执行顺序跳动以及断点无法停在某一行。碰到这些现象时,要先确认工程实际使用的优化配置,再判断是调试信息显示变化,还是程序运行结果真的出了问题。
IAR Embedded Workbench运行C/C++程序时,局部变量、函数调用现场和部分中断上下文会占用栈空间,malloc、calloc以及C++的new等动态分配则会使用堆。程序平时运行正常,一进入深层函数、复杂中断或者处理较大局部数组就出现HardFault、随机复位、变量值异常,很可能和栈空间有关。判断这类问题时,可以把C-SPY运行时监控、链接器静态分析和ICF中的内存配置放在一起看,也要把堆空间不足和栈溢出分开。
IAR Embedded Workbench把程序写入目标芯片后,CPU下一步是停在复位入口、运行到main暂停,还是脱离调试器后自行启动,和C-SPY的下载方式、Run to配置以及硬件调试驱动的复位策略都有关系。程序能够正常编译和写入Flash,却在下载后一直停着,先别急着改启动代码,可以先确认当前执行的是下载还是调试启动,再检查复位后的PC、SP和程序入口。
IAR Embedded Workbench for Arm通常使用ICF文件控制程序在Flash和RAM中的布局,代码区、数据区、栈、堆以及部分启动相关段都会受到链接配置影响。工程能够正常编译、链接,却在下载后停在复位阶段、跑不到main、出现HardFault或直接无法下载时,可以把链接器配置和芯片实际存储布局放在一起核对,尤其要检查工程选择的器件、ROM起始地址、RAM范围和启动代码使用的地址。